home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 1
/
SPACE - Library 1 - Volume 1.iso
/
program
/
355
/
source
/
oops_js
/
oops.mod
< prev
next >
Wrap
Text File
|
1990-02-02
|
7KB
|
223 lines
MODULE oops; (* Ken Badertscher (KBAD) 2/22/87 *)
(* Enhanced version of errout, takes compiler-generated ERR.DAT and ERR.LST,
flags errors and inserts error messages into source file *)
(****************************************************)
(* Written using the Jefferson Software Modula-2 *)
(* Development System *)
(* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
(* Jefferson Software (602)243-3106 *)
(* 12416 N 28th Dr #18-236, Phoenix, AZ 85029-2434 *)
(* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
(* For information on and examples of JS Modula, *)
(* call the PHASE BBS (602)849-1287, 24 hours, *)
(* up to 2400 baud, and visit SIG 8. *)
(****************************************************)
FROM Terminal IMPORT
Read, Write, WriteLn, WriteString;
FROM FileSystem IMPORT
(*TYPE*)
File, Response,
(*PROCEDURE*)
Lookup, ReadChar, WriteChar, Close, Delete, Rename;
(* modules needed due to "too many strings" limit of 127 string constants *)
FROM oopsmsg1 IMPORT AssignErr1,ErrMsgs;
FROM oopsmsg2 IMPORT AssignErr2;
FROM oopsmsg3 IMPORT AssignErr3;
CONST NL = 27; (* max filename length *)
Old = FALSE; (* for Lookup calls *)
New = TRUE; (* for Lookup calls *)
ErrPerLine = 4; (* errors detected per line *)
ChPerErr = 78; (* max error message length *)
TotErrMsgs = 172; (* total number of defined error msgs *)
TYPE ErrLns = ARRAY [0..ErrPerLine] OF
ARRAY [0..ChPerErr] OF CHAR;
VAR ch: CHAR;
InFileName,OutFileName: ARRAY [0..NL] OF CHAR;
i,j,errpos,pos,errInLine: INTEGER;
error : CARDINAL;
errDAT, errf, source : File;
moreErrors : BOOLEAN;
errorLines : ErrLns;
errorMsgs : ErrMsgs;
PROCEDURE GetError (f : File;
VAR erroff : INTEGER;
VAR errnum : CARDINAL) : BOOLEAN;
(* reads next error from err.dat, returns error number and "more" flag *)
VAR more : BOOLEAN;
err : RECORD
CASE :INTEGER OF
0: a,b,c,d : CHAR
| 1: x,offset : INTEGER
END;
CASE :INTEGER OF
0: l,h : CHAR
| 1: error : CARDINAL
END
END;
BEGIN
ReadChar(f,err.d);
more := (err.d = 301C); (* start char of error entry *)
IF more THEN
ReadChar(f,err.d); (* offset of error in source file *)
ReadChar(f,err.c);
ReadChar(f,err.b); (* 2 dummy bytes *)
ReadChar(f,err.a);
ReadChar(f,err.h); (* error number *)
ReadChar(f,err.l);
erroff := err.offset;
errnum := err.error;
(* check if error is defined, or needs offset calculated
undefined errors: 0-9,29,43-49,87,99,138,143,148,149,151-199,217,221 *)
IF (errnum < 10) OR (errnum = 29) OR ((errnum >42) AND (errnum < 50))
OR (errnum = 87) OR (errnum = 99) OR (errnum = 138)
OR (errnum = 143) OR (errnum = 148) OR (errnum = 149)
OR ((errnum > 150) AND (errnum < 200)) OR (errnum = 217)
OR (errnum = 221) OR (errnum > 226)
THEN errnum := 0;
(* Offsets for error numbers > 199 *)
ELSIF ((errnum > 199) AND (errnum < 217))
THEN errnum := errnum - 49;
ELSIF ((errnum > 221) AND (errnum < 227))
THEN errnum := errnum - 54;
END (* IF errnum *) ;
END (* IF more *) ;
RETURN more;
END GetError;
BEGIN (* m2err *)
(* read error messages into errorMsgs *)
AssignErr1(errorMsgs);
AssignErr2(errorMsgs);
AssignErr3(errorMsgs);
(* open error file, get source filename *)
Lookup(errDAT, 'err.dat', Old);
IF (errDAT.res = done) THEN
ReadChar(errDAT,ch);
IF (ch = 300C) THEN
i := 0;
WHILE (ch # 0C) DO
ReadChar(errDAT,ch);
InFileName[i] := ch;
INC(i);
END;
ELSE
WriteString ('ERR.DAT had a bad header.'); WriteLn;
Close(errDAT);
HALT;
END;
Lookup(source, InFileName, Old);
IF (source.res = done) THEN
WriteLn; WriteString('Flagging errors in '); WriteString(InFileName);
(* Set output filename, open new error file *)
i := 0;
REPEAT
OutFileName[i] := InFileName[i];
INC(i)
UNTIL (InFileName[i] = '.') OR (InFileName[i] = 0C);
OutFileName[i] := '.';
OutFileName[i+1] := 'E';
OutFileName[i+2] := 'R';
OutFileName[i+3] := 'R';
Lookup(errf,OutFileName,New);
IF (errf.res = callerror) THEN (* old file opened *)
Close(errf);
Delete(errf);
Lookup(errf,OutFileName,New)
END;
(* write error file *)
IF (errf.res = done) THEN
pos := 0;
moreErrors := GetError(errDAT,errpos,error);
WHILE moreErrors DO
(* copy until error reached *)
errInLine := 0;
REPEAT
ReadChar(source,ch);
WriteChar(errf,ch);
INC(pos);
(* flag error and store message until EOL reached *)
IF (moreErrors) AND (pos >= errpos) THEN
IF (errInLine <= ErrPerLine) THEN
WriteChar(errf,'('); WriteChar(errf,'*');
WriteChar(errf,'<'); WriteChar(errf,'@');
WriteChar(errf,'*'); WriteChar(errf,')');
i := 0;
REPEAT
errorLines[errInLine][i] := errorMsgs[error][i];
INC(i);
UNTIL (errorMsgs[error][i] = 0C);
INC(errInLine);
END;
WriteLn; WriteString('oops!');
moreErrors := GetError(errDAT,errpos,error);
END;
UNTIL (ch = 12C);
(* write error message(s) *)
FOR i := 0 TO (errInLine-1) DO
j := 0;
REPEAT
WriteChar(errf,errorLines[i][j]);
errorLines[i][j] := 0C;
INC(j);
UNTIL (errorLines[i][j] = 0C);
WriteChar(errf,15C);WriteChar(errf,12C);
END (* FOR i *) ;
END (* WHILE moreErrors *);
(* no more errors - copy remainder of source *)
ReadChar(source,ch);
WHILE (NOT source.eof) DO
WriteChar(errf,ch);
ReadChar(source,ch);
END;
WriteChar(errf,15C);
WriteChar(errf,12C);
(* Cleanup *)
Close(errDAT);
Delete(errDAT);
Close(source);
Delete(source);
Rename(errf,InFileName);
Close(errf);
Lookup(errDAT, 'err.lst', Old);
IF (errDAT.res = done) THEN
Close(errDAT);
Delete(errDAT);
END;
WriteLn; WriteLn;
WriteString(InFileName); WriteString(' rewritten.'); WriteLn;
ELSE
Close(source);
Close(errDAT);
WriteLn; WriteLn;
WriteString('Error opening '); WriteString(OutFileName);
END (* IF (errf.res = done) *);
ELSE
WriteLn; WriteString(InFileName); WriteString(" not found."); WriteLn;
Close(errDAT);
END (* IF (source.res = done) *);
ELSE
WriteLn; WriteString('Lookup errDAT returned an error.'); WriteLn;
END (* IF (errDAT.res = done) *);
WriteLn; WriteString("That's all, folks!"); WriteLn;
END oops.